﻿using System;
using System.Configuration;
using System.IO;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Diagnostics;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Sinacor.OMM.Deployment.Configurator
{
    public partial class OMMConfigurator : Window
    {
        #region Propriedades

        private static String _configFile;
        private Int32 _companyId;
        private String _errosValidacao;
        private bool _errorLoad;

        private ResourceAccess.Dumper _raDumper;
        private ResourceAccess.HealthMonitor _raHealthMonitor;
        private ResourceAccess.HFTMessageManager _raHFTMessageManager;
        private ResourceAccess.Receptor _raReceptor;
        private ResourceAccess.Router _raRouter;
        private ResourceAccess.Repository _raRepository;

        public Entity.Dumper dumper { get; set; }
        public Entity.HealthMonitor healthMonitor { get; set; }
        public List<Entity.HFTMessageManager> hFTMessageManager { get; set; }
        public Entity.HFTMessageManager currentHFTProcess { get; set; }
        public Entity.Receptor receptor { get; set; }
        public Entity.Router router { get; set; }

        #endregion

        #region Construtor

        public OMMConfigurator()
        {

            //while (!System.Diagnostics.Debugger.IsAttached)
            //        System.Threading.Thread.Sleep(1000);
            this.Loaded += new RoutedEventHandler(OMMConfigurator_Loaded);
            this.Initialized +=new EventHandler(OMMConfigurator_Initialized);

            this.InitializeComponent();

            this.DataContext = this;
            
        }

        void OMMConfigurator_Initialized(object sender, EventArgs e)
        {
            try
            {
                _errorLoad = false;

                if (string.IsNullOrEmpty(_configFile))
                    _configFile = Path.Combine(Path.GetDirectoryName(System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).FilePath), "Configurator.exe");

                System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(_configFile);

                if (config == null)
                    throw new ConfigurationErrorsException(string.Format("Arquivo de configuração '{0}'.config não encontrado.", _configFile));

                if (!Int32.TryParse(config.AppSettings.Settings["companyId"].Value, out _companyId))
                {
                    throw new ConfigurationErrorsException(String.Format("Código da empresa não encontrado, impossível realizar a conexão com o banco de dados do Sinacor." + System.Environment.NewLine +
                                                                         "Verificar a tag appSettings do arquivo {0}.config. Verificar a existência da chave  <add key='companyId' value='' />.", _configFile));
                }
                else
                {
                    _raDumper = new ResourceAccess.Dumper(_companyId);
                    _raHealthMonitor = new ResourceAccess.HealthMonitor(_companyId);
                    _raHFTMessageManager = new ResourceAccess.HFTMessageManager(_companyId);
                    _raReceptor = new ResourceAccess.Receptor(_companyId);
                    _raRepository = new ResourceAccess.Repository(_companyId);
                    _raRouter = new ResourceAccess.Router(_companyId);

                    dumper = new Entity.Dumper();
                    healthMonitor = new Entity.HealthMonitor();
                    hFTMessageManager = new List<Entity.HFTMessageManager>();
                    receptor = new Entity.Receptor();
                    router = new Entity.Router();

                    CarregarConfigurationManager();
                }
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("OMMConfiguratorManager Initialized", ex.Message, EventLogEntryType.Error);

                if (ex.Message.Substring(0, 3) == "ORA")
                    System.Windows.MessageBox.Show("Não foi possível carregar a tela de configuração. \n Verifique as configurações da Base de Dados.");
                else
                    System.Windows.MessageBox.Show("Não foi possível carregar a tela de configuração.");

                _errorLoad = true;
            }
        }

        void OMMConfigurator_Loaded(object sender, RoutedEventArgs e)
        {
            if (_errorLoad)
                this.Close();
        }

        #endregion

        #region Eventos

        #region Eventos Receptor

        private void BtnDiretorioArquivo_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.FolderBrowserDialog folderPicker = new System.Windows.Forms.FolderBrowserDialog();
            folderPicker.Description = "Selecione o diretório para geração do arquivo.";
            folderPicker.ShowDialog();

            if (folderPicker.SelectedPath != string.Empty)
            {
                TxtDiretorioArquivo.Text = folderPicker.SelectedPath;
                BtnDiretorioArquivo.IsEnabled = true;
            }
        }

        #endregion

        #region Eventos Dumper

        private void btnDiretorioDumper_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.FolderBrowserDialog folderPicker = new System.Windows.Forms.FolderBrowserDialog();
            folderPicker.Description = "Selecione o diretório para geração do arquivo.";
            folderPicker.ShowDialog();

            if (folderPicker.SelectedPath != string.Empty)
            {
                TxtDiretorioDumper.Text = folderPicker.SelectedPath;
                btnDiretorioDumper.IsEnabled = true;
            }
        }

        #endregion

        #region Eventos HealthMonitor

        private void btnDiretorioLogServidor_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.FolderBrowserDialog folderPicker = new System.Windows.Forms.FolderBrowserDialog();
            folderPicker.Description = "Selecione o diretório para geração do arquivo.";
            folderPicker.ShowDialog();

            if (folderPicker.SelectedPath != string.Empty)
            {
                TxtDiretorioLogServidor.Text = folderPicker.SelectedPath;
                btnDiretorioLogServidor.IsEnabled = true;
            }
        }

        private void btnDiretorioLog_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.FolderBrowserDialog folderPicker = new System.Windows.Forms.FolderBrowserDialog();
            folderPicker.Description = "Selecione o diretório para geração do arquivo.";
            folderPicker.ShowDialog();

            if (folderPicker.SelectedPath != string.Empty)
            {
                TxtDiretorioLog.Text = folderPicker.SelectedPath;
                btnDiretorioLog.IsEnabled = true;
            }
        }

        #endregion

        #region Eventos Salvar

        private void Label_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            tabReceptor.Focus();
            SalvarConfigurationManager();
        }

        #endregion

        #endregion

        #region Métodos

        private void CarregarConfigurationManager()
        {
            dumper = _raDumper.ConsultarDumper();
            healthMonitor = _raHealthMonitor.ConsultarMonitor();
            this.CarregarHFT();
            receptor = _raReceptor.ConsultarReceptor();
            router = _raRouter.ConsultarRoteador();
        }

        private void CarregarHFT()
        {
            hFTMessageManager = _raHFTMessageManager.ConsultarHFT();

            VisibilityHFTProcess();

            #region Checkbox

            chkHFTProcess01.IsChecked = false;
            chkHFTProcess02.IsChecked = false;
            chkHFTProcess03.IsChecked = false;
            chkHFTProcess04.IsChecked = false;
            chkHFTProcess05.IsChecked = false;
            chkHFTProcess06.IsChecked = false;
            chkHFTProcess07.IsChecked = false;
            chkHFTProcess08.IsChecked = false;

            #endregion
        }

        private void VisibilityHFTProcess()
        {
            #region Visibility HFTProccess

            Int32 _hftprocess = 1;

            if (hFTMessageManager.Count >= _hftprocess)
            {
                this.HFTProcess01.Visibility = Visibility.Visible;
                _hftprocess++;
            }
            else
                this.HFTProcess01.Visibility = Visibility.Collapsed;

            if (hFTMessageManager.Count >= _hftprocess)
            {
                this.HFTProcess02.Visibility = Visibility.Visible;
                _hftprocess++;
            }
            else
                this.HFTProcess02.Visibility = Visibility.Collapsed;

            if (hFTMessageManager.Count >= _hftprocess)
            {
                this.HFTProcess03.Visibility = Visibility.Visible;
                _hftprocess++;
            }
            else
                this.HFTProcess03.Visibility = Visibility.Collapsed;

            if (hFTMessageManager.Count >= _hftprocess)
            {
                this.HFTProcess04.Visibility = Visibility.Visible;
                _hftprocess++;
            }
            else
                this.HFTProcess04.Visibility = Visibility.Collapsed;

            if (hFTMessageManager.Count >= _hftprocess)
            {
                this.HFTProcess05.Visibility = Visibility.Visible;
                _hftprocess++;
            }
            else
                this.HFTProcess05.Visibility = Visibility.Collapsed;

            if (hFTMessageManager.Count >= _hftprocess)
            {
                this.HFTProcess06.Visibility = Visibility.Visible;
                _hftprocess++;
            }
            else
                this.HFTProcess06.Visibility = Visibility.Collapsed;

            if (hFTMessageManager.Count >= _hftprocess)
            {
                this.HFTProcess07.Visibility = Visibility.Visible;
                _hftprocess++;
            }
            else
                this.HFTProcess07.Visibility = Visibility.Collapsed;

            if (hFTMessageManager.Count >= _hftprocess)
            {
                this.HFTProcess08.Visibility = Visibility.Visible;
                _hftprocess++;
            }
            else
                this.HFTProcess08.Visibility = Visibility.Collapsed;

            #endregion
        }

        public void SalvarConfigurationManager()
        {
            try
            {
                if (ValidarConfigurationManager())
                {
                    SalvarReceptor();
                    SalvarRouter();
                    SalvarHFTMessageManager();
                    SalvarDumper();
                    SalvarHealthMonitor();

                    System.Windows.MessageBox.Show("Configurações salvas com sucesso.");

                    CarregarConfigurationManager();

                    this.btnSalvarHFT.Visibility = Visibility.Hidden;
                    this.btnIncluirHFT.Visibility = Visibility.Visible;
                }
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("OMMConfiguratorManager", "SalvarConfigurationManager(): " + ex.Message, EventLogEntryType.Error);
                System.Windows.MessageBox.Show("Não foi possível salvar as configurações.");
                this.Close();
            }
        }

        private void SalvarDumper()
        {
            try
            {
                _raDumper.AlterarDumper(dumper);
                _raRepository.AlterarRepositorio(dumper.Repositorio);
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("OMMConfiguratorManager", "SalvarDumper(): " + ex.Message, EventLogEntryType.Error);
                throw ex;
            }

        }

        private void SalvarHealthMonitor()
        {
            try
            {
                _raHealthMonitor.AlterarMonitor(healthMonitor);
                _raRepository.AlterarRepositorio(healthMonitor.Repositorio);
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("OMMConfiguratorManager", "SalvarHealthMonitor(): " + ex.Message, EventLogEntryType.Error);
                throw ex;
            }

        }

        private void SalvarReceptor()
        {
            try
            {

                if(!String.IsNullOrEmpty(receptor.SenhaConexaoSTM))
                    receptor.SenhaConexaoSTM = PSE.Framework.Cryptography.RijndaelCryptographer.EncryptString(receptor.SenhaConexaoSTM);

                _raReceptor.AlterarReceptor(receptor);
                _raRepository.AlterarRepositorio(receptor.Repositorio);
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("OMMConfiguratorManager", "SalvarReceptor(): " + ex.Message, EventLogEntryType.Error);
                throw ex;
            }
        }

        private void SalvarRouter()
        {
            try
            {
                _raRouter.AlterarRoteador(router);
                _raRepository.AlterarRepositorio(router.Repositorio);
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("OMMConfiguratorManager", "SalvarRouter(): " + ex.Message, EventLogEntryType.Error);
                throw ex;
            }
        }

        private void SalvarHFTMessageManager()
        {
            try
            {
                foreach(Entity.HFTMessageManager hft in hFTMessageManager)
                {
                    _raHFTMessageManager.ExcluirHFT(hft);
                    _raRepository.ExcluirRepository(hft.Repositorio);
                    _raRepository.IncluirRepository(hft.Repositorio);
                    _raHFTMessageManager.IncluirHFT(hft);
                }
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("OMMConfiguratorManager", "SalvarHFTMessageManager(): " + ex.Message, EventLogEntryType.Error);
                throw ex;
            }
        }

        #region Validações

        public bool ValidarConfigurationManager()
        {
            bool retorno = false;

            _errosValidacao = String.Empty;

            retorno = ValidarReceptor();
            if (retorno) retorno = ValidarRouter();
            if (retorno) retorno = ValidarDumper();
            if (retorno) retorno = ValidarHFTMessageManager();
            if (retorno) retorno = ValidarHealthMonitor();

            if(!retorno)
                System.Windows.MessageBox.Show(_errosValidacao);

            return retorno;
        }

        private bool ValidarReceptor()
        {
            bool retorno = true;

            if (String.IsNullOrEmpty(receptor.NomeCanal))
            {
                _errosValidacao += "Nome Canal do receptor é obrigatório. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(receptor.UsuarioConexaoSTM))
            {
                _errosValidacao += "Usuário STM do receptor é obrigatório. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(receptor.Repositorio.Fila))
            {
                _errosValidacao += "Fila Repositório do Receptor é obrigatória. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(receptor.Repositorio.LimiteTamanho.ToString()))
            {
                _errosValidacao += "Tamanho da Fila Repositório do Receptor é obrigatória. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(receptor.Repositorio.LimiteMensagem.ToString()))
            {
                _errosValidacao += "Mensagens Represadas na Fila Repositório do Receptor é obrigatória. \n";
                retorno = false;
            }

            return retorno;
        }

        private bool ValidarRouter()
        {
            bool retorno = true;

            if (String.IsNullOrEmpty(router.Repositorio.Fila))
            {
                _errosValidacao += "Fila Repositório do Roteador é obrigatória. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(router.Repositorio.LimiteTamanho.ToString()))
            {
                _errosValidacao += "Tamanho da Fila Repositório do Roteador é obrigatória. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(router.Repositorio.LimiteMensagem.ToString()))
            {
                _errosValidacao += "Mensagens Represadas na Fila Repositório do Roteador é obrigatória. \n";
                retorno = false;
            }

            return retorno;
        }

        private bool ValidarHealthMonitor()
        {
            bool retorno = true;

            if (String.IsNullOrEmpty(healthMonitor.ArquivoLog))
            {
                _errosValidacao += "Nome do Arquivo Log do Health Monitor é obrigatório. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(healthMonitor.ServidorTCP))
            {
                _errosValidacao += "Servidor TCP do Health Monitor é obrigatório. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(healthMonitor.DiretorioLog))
            {
                _errosValidacao += "Diretório Log do Health Monitor é obrigatório. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(healthMonitor.DiretorioLogServidor))
            {
                _errosValidacao += "Arquivo Log Serv. do Health Monitor é obrigatório. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(healthMonitor.Repositorio.Fila))
            {
                _errosValidacao += "Fila Repositório do Health Monitor é obrigatória. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(healthMonitor.Repositorio.LimiteTamanho.ToString()))
            {
                _errosValidacao += "Tamanho da Fila Repositório do Health Monitor é obrigatória. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(healthMonitor.Repositorio.LimiteMensagem.ToString()))
            {
                _errosValidacao += "Mensagens Represadas na Fila Repositório do Health Monitor é obrigatória. \n";
                retorno = false;
            }

            return retorno;
        }

        private bool ValidarDumper()
        {
            bool retorno = true;

            if (String.IsNullOrEmpty(dumper.DiretorioDumper))
            {
                _errosValidacao += "Diretório do Dumper é obrigatório. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(dumper.Repositorio.Fila))
            {
                _errosValidacao += "Fila Repositório do Dumper é obrigatória. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(dumper.Repositorio.LimiteTamanho.ToString()))
            {
                _errosValidacao += "Tamanho da Fila Repositório do Dumper é obrigatória. \n";
                retorno = false;
            }
            if (String.IsNullOrEmpty(dumper.Repositorio.LimiteMensagem.ToString()))
            {
                _errosValidacao += "Mensagens Represadas na Fila Repositório do Dumper é obrigatória. \n";
                retorno = false;
            }

            return retorno;
        }

        private bool ValidarHFTMessageManager()
        {
            bool retorno = true;
            int contador = 0;

            foreach (Entity.HFTMessageManager hft in hFTMessageManager)
            {
                contador++;

                if (String.IsNullOrEmpty(hft.Repositorio.Fila))
                {
                    _errosValidacao += "Fila Repositório do Processo HFT [" + contador + "] é obrigatória. \n";
                    retorno = false;
                }
                if (String.IsNullOrEmpty(hft.Repositorio.LimiteTamanho.ToString()))
                {
                    _errosValidacao += "Tamanho da Fila Repositório do Processo HFT [" + contador + "] é obrigatória. \n";
                    retorno = false;
                }
                if (String.IsNullOrEmpty(hft.Repositorio.LimiteMensagem.ToString()))
                {
                    _errosValidacao += "Mensagens Represadas na Fila Repositório do Processo HFT [" + contador + "] é obrigatória. \n";
                    retorno = false;
                }
                if (String.IsNullOrEmpty(hft.MacAddress))
                {
                    _errosValidacao += "MacAddress do Processo HFT [" + contador + "] é obrigatório. \n";
                    retorno = false;
                }
                if (String.IsNullOrEmpty(hft.DiretorioArquivo))
                {
                    _errosValidacao += "Diretório do Arquivo do Processo HFT [" + contador + "] é obrigatório. \n";
                    retorno = false;
                }
            }

            return retorno;
        }

        #endregion 

        #endregion

        private void btnDiretorioArquivoHFT_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.FolderBrowserDialog folderPicker = new System.Windows.Forms.FolderBrowserDialog();
            folderPicker.Description = "Selecione o diretório para geração do arquivo.";
            folderPicker.ShowDialog();

            if (folderPicker.SelectedPath != string.Empty)
            {
                if(currentHFTProcess != null)
                    currentHFTProcess.DiretorioArquivo = folderPicker.SelectedPath;
                else
                    TxtDiretorioArquivoHFT.Text = folderPicker.SelectedPath;

                BindingExpression beHFT = TxtDiretorioArquivoHFT.GetBindingExpression(System.Windows.Controls.TextBox.TextProperty);
                beHFT.UpdateTarget();

                btnDiretorioArquivoHFT.IsEnabled = true;
            }
        }

        private void HFTProcess01_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            currentHFTProcess = hFTMessageManager[0];

            BindingExpression beHFT = gridHFT.GetBindingExpression(Grid.DataContextProperty);
            beHFT.UpdateTarget();
        }

        private void HFTProcess02_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            currentHFTProcess = hFTMessageManager[1];

            BindingExpression beHFT = gridHFT.GetBindingExpression(Grid.DataContextProperty);
            beHFT.UpdateTarget();
        }

        private void HFTProcess03_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            currentHFTProcess = hFTMessageManager[2];

            BindingExpression beHFT = gridHFT.GetBindingExpression(Grid.DataContextProperty);
            beHFT.UpdateTarget();
        }

        private void HFTProcess04_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            currentHFTProcess = hFTMessageManager[3];

            BindingExpression beHFT = gridHFT.GetBindingExpression(Grid.DataContextProperty);
            beHFT.UpdateTarget();
        }

        private void HFTProcess05_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            currentHFTProcess = hFTMessageManager[4];

            BindingExpression beHFT = gridHFT.GetBindingExpression(Grid.DataContextProperty);
            beHFT.UpdateTarget();
        }

        private void HFTProcess06_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            currentHFTProcess = hFTMessageManager[5];

            BindingExpression beHFT = gridHFT.GetBindingExpression(Grid.DataContextProperty);
            beHFT.UpdateTarget();
        }

        private void HFTProcess07_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            currentHFTProcess = hFTMessageManager[6];

            BindingExpression beHFT = gridHFT.GetBindingExpression(Grid.DataContextProperty);
            beHFT.UpdateTarget();
        }

        private void HFTProcess08_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            currentHFTProcess = hFTMessageManager[7];

            BindingExpression beHFT = gridHFT.GetBindingExpression(Grid.DataContextProperty);
            beHFT.UpdateTarget();
        }

        private void btnCancelarHFT_Click(object sender, RoutedEventArgs e)
        {
                CarregarHFT();

                this.btnSalvarHFT.Visibility = Visibility.Hidden;
                this.btnCancelarHFT.Visibility = Visibility.Hidden;
                this.btnIncluirHFT.Visibility = Visibility.Visible;
                this.btnExcluirHFT.Visibility = Visibility.Visible;
        }

        private void btnExcluirHFT_Click(object sender, RoutedEventArgs e)
        {
            bool _checked = false;

            if (chkHFTProcess01.IsChecked.Value)
            {
                _raHFTMessageManager.ExcluirHFT(hFTMessageManager[0]);
                _checked = true;
            }

            if (chkHFTProcess02.IsChecked.Value)
            {
                _raHFTMessageManager.ExcluirHFT(hFTMessageManager[1]);
                _checked = true;
            }

            if (chkHFTProcess03.IsChecked.Value)
            {
                _raHFTMessageManager.ExcluirHFT(hFTMessageManager[2]);
                _checked = true;
            }

            if (chkHFTProcess04.IsChecked.Value)
            {
                _raHFTMessageManager.ExcluirHFT(hFTMessageManager[3]);
                _checked = true;
            }

            if (chkHFTProcess05.IsChecked.Value)
            {
                _raHFTMessageManager.ExcluirHFT(hFTMessageManager[4]);
                _checked = true;
            }

            if (chkHFTProcess06.IsChecked.Value)
            {
                _raHFTMessageManager.ExcluirHFT(hFTMessageManager[5]);
                _checked = true;
            }

            if (chkHFTProcess07.IsChecked.Value)
            {
                _raHFTMessageManager.ExcluirHFT(hFTMessageManager[6]);
                _checked = true;
            }

            if (chkHFTProcess08.IsChecked.Value)
            {
                _raHFTMessageManager.ExcluirHFT(hFTMessageManager[7]);
                _checked = true;
            }

            if (_checked)
            {
                CarregarHFT();

                this.btnSalvarHFT.Visibility = Visibility.Hidden;
                this.btnCancelarHFT.Visibility = Visibility.Hidden;
                this.btnIncluirHFT.Visibility = Visibility.Visible;
                this.btnExcluirHFT.Visibility = Visibility.Visible;
            }
        }

        private void btnIncluirHFT_Click(object sender, RoutedEventArgs e)
        {
            if (hFTMessageManager.Count < 8)
            {
                Entity.HFTMessageManager newHFT = new Entity.HFTMessageManager();
                hFTMessageManager.Add(newHFT);
                VisibilityHFTProcess();
                currentHFTProcess = hFTMessageManager[hFTMessageManager.Count -1];
                BindingExpression beHFT = gridHFT.GetBindingExpression(Grid.DataContextProperty);
                beHFT.UpdateTarget();
                this.btnIncluirHFT.Visibility = Visibility.Hidden;
                this.btnSalvarHFT.Visibility = Visibility.Visible;
                this.btnExcluirHFT.Visibility = Visibility.Hidden;
                this.btnCancelarHFT.Visibility = Visibility.Visible;
            }
        }

        private void btnSalvarHFT_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _errosValidacao = String.Empty;
                bool retorno = true;

                if (currentHFTProcess != null)
                {
                    if (String.IsNullOrEmpty(currentHFTProcess.Repositorio.Fila))
                    {
                        _errosValidacao += "Fila Repositório do Processo HFT é obrigatória. \n";
                        retorno = false;
                    }
                    if (String.IsNullOrEmpty(currentHFTProcess.Repositorio.LimiteTamanho.ToString()))
                    {
                        _errosValidacao += "Tamanho da Fila Repositório do Processo HFT é obrigatória. \n";
                        retorno = false;
                    }
                    if (String.IsNullOrEmpty(currentHFTProcess.Repositorio.LimiteMensagem.ToString()))
                    {
                        _errosValidacao += "Mensagens Represadas na Fila Repositório do Processo HFT é obrigatória. \n";
                        retorno = false;
                    }
                    if (String.IsNullOrEmpty(currentHFTProcess.MacAddress))
                    {
                        _errosValidacao += "MacAddress do Processo HFT é obrigatório. \n";
                        retorno = false;
                    }
                    if (String.IsNullOrEmpty(currentHFTProcess.DiretorioArquivo))
                    {
                        _errosValidacao += "Diretório do Arquivo do Processo HFT é obrigatório. \n";
                        retorno = false;
                    }

                }
                if (retorno)
                {
                    _raRepository.IncluirRepository(currentHFTProcess.Repositorio);
                    _raHFTMessageManager.IncluirHFT(currentHFTProcess);

                    this.CarregarHFT();
                    this.btnSalvarHFT.Visibility = Visibility.Hidden;
                    this.btnIncluirHFT.Visibility = Visibility.Visible;
                    this.btnExcluirHFT.Visibility = Visibility.Visible;
                    this.btnCancelarHFT.Visibility = Visibility.Hidden;

                }
                else
                {
                    System.Windows.MessageBox.Show(_errosValidacao);
                }
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("OMMConfiguratorManager", "SalvarHFT(): " + ex.Message, EventLogEntryType.Error);
                System.Windows.MessageBox.Show("Não foi possível salvar o processo HFT.");
            }
        }

    }

    public static class PasswordBoxAssistant   
    {       
        public static readonly DependencyProperty BoundPassword = DependencyProperty.RegisterAttached("BoundPassword", typeof(string), typeof(PasswordBoxAssistant), new PropertyMetadata(string.Empty, OnBoundPasswordChanged));         
        public static readonly DependencyProperty BindPassword = DependencyProperty.RegisterAttached("BindPassword", typeof (bool), typeof (PasswordBoxAssistant), new PropertyMetadata(false, OnBindPasswordChanged));         
        private static readonly DependencyProperty UpdatingPassword = DependencyProperty.RegisterAttached("UpdatingPassword", typeof(bool), typeof(PasswordBoxAssistant), new PropertyMetadata(false)); 
        
        private static void OnBoundPasswordChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)       
        {           
            PasswordBox box = d as PasswordBox;             
            // only handle this event when the property is attached to a PasswordBox           
            // and when the BindPassword attached property has been set to true           
            if (d == null || !GetBindPassword(d))           
            {               
                return;           
            }             
            
            // avoid recursive updating by ignoring the box's changed event           
            box.PasswordChanged -= HandlePasswordChanged;             
            string newPassword = (string)e.NewValue;             
            if (!GetUpdatingPassword(box))           
            {               
                box.Password = newPassword;           
            }             
            box.PasswordChanged += HandlePasswordChanged;       
        }         
        
        private static void OnBindPasswordChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)       
        {           
            // when the BindPassword attached property is set on a PasswordBox,           
            // start listening to its PasswordChanged event             
            PasswordBox box = dp as PasswordBox;             
            if (box == null)           
            {               
                return;           
            }             
            bool wasBound = (bool)(e.OldValue);           
            bool needToBind = (bool)(e.NewValue);             
            if (wasBound)           
            {               
                box.PasswordChanged -= HandlePasswordChanged;           
            }             
            if (needToBind)           
            {               
                box.PasswordChanged += HandlePasswordChanged;           
            }       
        }         
        
        private static void HandlePasswordChanged(object sender, RoutedEventArgs e)       
        {           
            PasswordBox box = sender as PasswordBox;             
            // set a flag to indicate that we're updating the password           
            SetUpdatingPassword(box, true);           
            // push the new password into the BoundPassword property           
            SetBoundPassword(box, box.Password);           
            SetUpdatingPassword(box, false);       
        }         
        
        public static void SetBindPassword(DependencyObject dp, bool value)       
        {           
            dp.SetValue(BindPassword, value);       
        }         
        
        public static bool GetBindPassword(DependencyObject dp)       
        {           
            return (bool)dp.GetValue(BindPassword);       
        }         
        
        public static string GetBoundPassword(DependencyObject dp)       
        {           
            return (string)dp.GetValue(BoundPassword);       
        }         
        
        public static void SetBoundPassword(DependencyObject dp, string value)       
        {           
            dp.SetValue(BoundPassword, value);       
        }         
        
        private static bool GetUpdatingPassword(DependencyObject dp)       
        {           
            return (bool)dp.GetValue(UpdatingPassword);       
        }         
        
        private static void SetUpdatingPassword(DependencyObject dp, bool value)       
        {           
            dp.SetValue(UpdatingPassword, value);       
        }   
    } 

}
